//
//  WBNetworkManager.swift
//  desunireWeibo
//
//  Created by desunire on 2017/8/31.
//  Copyright © 2017年 desunire. All rights reserved.
//

import UIKit
import AFNetworking

/**
 - 如果日常开发中，发现网络请求返回的状态码是 405，不支持的网络请求方法
 - 首先应该查找网路请求方法是否正确
 */
enum WBHTTPMethod {
    case GET
    case POST
}

class WBNetworkManager: AFHTTPSessionManager {

    
    //访问令牌 2.006MM_SD0Rbgzbe636678a79kdbE3C  2.006MM_SDEZMLNB6b17eb2556HDTV9B
    //var AccessToken:String? //= "2.006MM_SDEZMLNB6b17eb2556HDTV9B"
    
    //用户uid
    var uid:String? = "3018947673"
    
    /// 用户登录标记[计算型属性]
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
    
    /// 用户账户的懒加载属性
    lazy var userAccount = WBUserAccount()
    
    //创建单例请求--手写单例  static let shared =
    /// 静态区／常量／闭包
    /// 在第一次访问时，执行闭包，并且将结果保存在 shared 常量中
    static let shared: WBNetworkManager = {
        
        // 实例化对象
        let instance = WBNetworkManager()
        
        // 设置响应反序列化支持的数据类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        // 返回对象
        return instance
    }()
    
    
    
    /// 专门负责拼接 token 的网络请求方法
    func tokenRequest(method: WBHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion:@escaping (_ json: AnyObject?, _ isSuccess: Bool)->()){        
        //
         guard let token = userAccount.access_token else {
            // FIXME :发送通知（token没有，需要登录）
            completion(nil,false)
            return
        }
        
        //实例化参数
        var parameters = parameters
        if parameters == nil {
            parameters = [String:AnyObject]()
        }
        
        parameters!["access_token"] = token as AnyObject
        request(URLString: URLString, parameters: parameters, completion: completion)
        
    }
    
    
    /// 封装 AFN 的 GET / POST 请求
    ///
    /// - parameter method:     GET / POST
    /// - parameter URLString:  URLString
    /// - parameter parameters: 参数字典
    /// - parameter completion: 完成回调[json(字典／数组), 是否成功]
    func request(method: WBHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion:@escaping (_ json: AnyObject?, _ isSuccess: Bool)->()) {
        
        // 成功回调
        let success = { (task: URLSessionDataTask, json: Any?)->() in
           // print(json!)
            completion(json as AnyObject,true)
        }
        // 失败回调
        let failure = { (task: URLSessionDataTask?, error: Error)->() in
            
            completion(error as AnyObject, false)
            //可选 能比较...
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token overDue")
                // FIXME :发送通知（token过期）
            }
            // 针对 403 处理用户 token 过期
            // 对于测试用户(应用程序还没有提交给新浪微博审核)每天的刷新量是有限的！
            // 超出上限，token 会被锁定一段时间
            // 解决办法，新建一个应用程序！
//            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
//                print("Token 过期了")
//                
//                // 发送通知，提示用户再次登录(本方法不知道被谁调用，谁接收到通知，谁处理！)
//                NotificationCenter.default.post(
//                    name: NSNotification.Name(rawValue: WBUserShouldLoginNotification),
//                    object: "bad token")
//            }
//            
//            // error 通常比较吓人，例如编号：XXXX，错误原因一堆英文！
            print("网络请求错误 \(error)")
//
//            completion(nil, false)
        }
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
    
}



